package com.ht.api.call;

import com.ht.api.bean.AjaxResult;
import com.ht.api.bean.LoginBean;
import com.ht.api.call.func.IFunctionCall;
import com.ht.api.db.exception.HtException;
import com.ht.api.db.util.FunctionUtil;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;

/**
 * 抽象业务执行器
 * @author asq
 * @createTime 2024年12月23日 21:02:18
 */
@Slf4j
public abstract class AbstractCall implements ICall {
	@Override
	public final AjaxResult execute(LoginBean me, JSONObject param, JSONObject config) {
		String before = config.getStr("before");
		String after = config.getStr("after");
		
		// 如果有before
		if (StrUtil.isNotBlank(before)) {
			IFunctionCall beforeFunc = FunctionUtil.getFunction(before);
			if (beforeFunc != null) {
				JSONObject json = param.getJSONObject(PARAM);
				beforeFunc.execute(me, json, null);
			} else {
				throw new HtException("前置函数不存在：" + before);
			}
		}
		
		// 执行业务方法
		AjaxResult result = doExecute(me, param, config);
		
		// 如果有after
		if (StrUtil.isNotBlank(after)) {
			IFunctionCall afterFunc = FunctionUtil.getFunction(after);
			if (afterFunc != null) {
				JSONObject json = param.getJSONObject(PARAM);
				JSONObject afterResult = (JSONObject) afterFunc.execute(me, json, result);
				if (afterResult != null) {
					result.putAll(afterResult);
				}
			} else {
				log.warn("[call]业务函数已经执行成功，但配置的后置函数不存在：{}", after);
			}
		}
		
		return result;
	}
	
	/**
	 * 执行具体业务
	 * @param me 操作人
	 * @param param 前端参数
	 * @param config 接口配置
	 * @return
	 */
	protected abstract AjaxResult doExecute(LoginBean me, JSONObject param, JSONObject config);
}
